import { Provide, Middleware } from '@midwayjs/decorator';
import { Context } from '@midwayjs/web'; // 使用 Web 模块的 Context
import jwt from 'jsonwebtoken';

/**
 * JWT 认证中间件
 * 对需要鉴权的接口进行 token 验证
 */
@Provide()
@Middleware()
export class AuthMiddleware {
  /**
   * resolve 方法返回真正的中间件函数
   * ctx: 请求上下文
   * next: 调用下一个中间件
   */
  resolve() {
    return async (ctx: Context, next: () => Promise<any>) => {
      // 从请求头或 query 获取 token
      const token =
        ctx.get('authorization')?.replace('Bearer ', '') || ctx.query.token;

      // 没有 token 返回 401
      if (!token) {
        ctx.status = 401;
        ctx.body = {
          success: false,
          error: '缺少令牌',
        };
        return;
      }

      try {
        // 验证 JWT
        const decoded = jwt.verify(token, process.env.JWT_SECRET || 'change_me');

        // 将用户信息挂载到 ctx.state
        ctx.state.user = decoded;

        // 调用下一个中间件
        await next();
      } catch (err) {
        // token 验证失败
        ctx.status = 401;
        ctx.body = {
          success: false,
          error: '令牌无效',
        };
      }
    };
  }
}
